﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PalcoCentral
{
    public partial class pcVerDisc : Form
    {
        private Database.person selectedAddToCoursePerson;
        private Database.course course;
        public pcVerDisc(Database.course course)
        {
            InitializeComponent();
            this.course = course;
            bannerLabel.Text = course.courseId + ". " + course.courseName + "\nGestor Principal > Ver Disciplina";
        }

        private void justnumeric_event_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && ((char) Keys.Back)!=e.KeyChar && e.KeyChar!=58)
                e.Handled = true;
        }

        private void pcVerDisc_Load(object sender, EventArgs e)
        {
            //if (person.personRole.CompareTo("Teacher") == 0)
            //{
            //    gerirPagBut.Enabled = false;
            //}
            refreshCoursesList();
            refreshClassList();
            verDisc();
            //insertData();
        }

        private void verDisc()
        {
            this.tipoDiscBox.SelectedItem = Library.CourseType.getValue(course.courseType).ToString();
            this.nameDiscTB.Text = course.courseName;
            this.descDiscTB.Text = course.courseDescription;
            this.instDiscTB.Text = course.instrument;
            this.observationsDisc.Text = course.observationsCourse;
            this.anoDiscTB.Text = course.year.ToString();
        }

        private void refreshCoursesList()
        {
            Library.OperationStatus os = Database.CourseDBAdapter.getInstance().showPersonsInCourse(course);
            if (os.sucess)
            {
                List<Database.person> res = (List<Database.person>)os.res;
                
                pessoasDiscList.DataSource = res;
                pessoasDiscList.Update();
                if (res != null && res.Count > 0)
                {
                    //personDB.DataSource = res;

                }
                else
                {
                    //Library.Utils.atentionFields("Esta disciplina ainda não tem pessoas associadas.", "Atenção");
                }
            }
        }

        private void refreshClassList()
        {
            Library.OperationStatus os = Database.CourseDBAdapter.getInstance().showClasses(course.courseId);
            if (os.sucess)
            {
                List<Database.@class> res = (List<Database.@class>)os.res;

                listaAulas.DataSource = res;
                listaAulas.Update();
                if (res != null && res.Count > 0)
                {
                    //personDB.DataSource = res;

                }
                else
                {
                    //Library.Utils.atentionFields("Esta disciplina ainda não tem pessoas associadas.", "Atenção");
                }
            }
        }

        private void saveCancelButtonDisabling(Boolean thisCase)
        {
            EditarDiscBut.Enabled = thisCase;
            addPessoaDisc.Enabled = thisCase;
            removePessoaDisc.Enabled = thisCase;
            deleteCursoBut.Enabled = thisCase;
            verHorarioDiscBut.Enabled = thisCase;
            discEditPannel.Enabled = !thisCase;

            saveEditDiscBut.Enabled = !thisCase;
            cancelEditDiscBut.Enabled = !thisCase;

            rlabel1.Visible = !thisCase;
            rlabel2.Visible = !thisCase;
            rlabel3.Visible = !thisCase;
            rlabelFather.Visible = !thisCase;
        }

        private void tipoDiscBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (tipoDiscBox.SelectedIndex == 0)
            {
                instDiscTB.Enabled = true;
            }
            else
            {
                instDiscTB.Enabled = false;
            }
        }

        private void EditarDiscBut_Click(object sender, EventArgs e)
        {
            saveCancelButtonDisabling(false);
        }

        private void saveEditDiscBut_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Deseja salvar esta edição?", "Salvar edição", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                course.courseType = Library.CourseType.getValue(this.tipoDiscBox.SelectedItem.ToString()).toStringDB();
                if (!string.IsNullOrEmpty(this.nameDiscTB.Text))
                {
                    course.courseName = this.nameDiscTB.Text;
                }
                else
                {
                    Library.Utils.errorFields("Nome de disciplina inválido.", "Erro a actualizar disciplina");
                    return;
                }
                int y = 0;
                if (int.TryParse(this.anoDiscTB.Text, out y))
                {
                    course.year = y;
                }
                else
                {
                    Library.Utils.errorFields("Ano inválido.", "Erro a actualizar disciplina");
                    return;
                }
                course.courseDescription = this.descDiscTB.Text;
                course.instrument = this.instDiscTB.Text;
                course.observationsCourse = this.observationsDisc.Text;

                Library.OperationStatus os = Database.CourseDBAdapter.getInstance().updateCourse(course);
                if (os.sucess)
                {
                    Library.Utils.sucessFields("A disciplina foi actualizada com sucesso.", "Actualizar disciplina");
                    this.Close();
                    return;
                }
                else
                {
                    Library.Utils.errorFields(os.errorMessage, "Erro a actualizar disciplina");
                }
            }
        }

        private void cancelEditDiscBut_Click(object sender, EventArgs e)
        {
            discEditPannel.Enabled = false;
            saveCancelButtonDisabling(true);
        }

        private void deleteCursoBut_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Deseja mesmo remover esta disciplina da base de dados?\nEsta operação irá remover as aulas associadas.", "Remover disciplina", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                Library.OperationStatus os = Database.CourseDBAdapter.getInstance().deleteCourse(course);
                if (os.sucess)
               {
                   Library.Utils.sucessFields("Disciplina removida com sucesso.", "Operação bem sucedida");
                   this.Close();
               }
               else
                {
                    Library.Utils.errorFields("Ocorreu um erro a remover a Disciplina.", "Erro na operação");
                }
            }  
        }

        private void removePessoaDisc_Click(object sender, EventArgs e)
        {
            if (!(pessoasDiscList.Items.Count == 0))
            {
                //Pessoa selecionada
                Database.person person = (Database.person)pessoasDiscList.SelectedItem;
                int id = course.courseId;
                if (person == null)
                {
                    return;
                }
                Library.PersonRole pr=new Library.PersonRole();
                if (person.personRole.Equals("Teacher"))
                {
                    pr = Library.PersonRole.Teacher;
                }
                else {
                    pr = Library.PersonRole.Student;
                }

                if (MessageBox.Show("Deseja mesmo remover esta pessoa desta disciplina?", "Desassociar pessoa e disciplina", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    Library.OperationStatus os = Database.CourseDBAdapter.getInstance().removePersonFromCourse(person,course,pr);
                    if (os.sucess)
                    {
                        Library.Utils.sucessFields("Desassociação concluida com sucesso.", "Operação bem sucedida");
                        refreshCoursesList();
                    }
                    else
                    {
                        Library.Utils.errorFields("Ocorreu um erro na desassociação.", "Erro na operação");
                    }
                }
            }
            else
            {
                Library.Utils.errorFields("Não existem pessoas na lista.", "Impossivel desassociar pessoa");
            }
        }
        private void addPessoaDisc_Click(object sender, EventArgs e)
        {
            pcSelectPessoa sp = new pcSelectPessoa();
            sp.ShowDialog();

            this.selectedAddToCoursePerson = sp.selectedPerson;

            addPessoaToCourse();
        }

        private void addPessoaToCourse()
        {
            int id = course.courseId;
            if (selectedAddToCoursePerson == null)
            {
                return;
            }
            Library.PersonRole pr = new Library.PersonRole();
            if (selectedAddToCoursePerson.personRole.Equals("Teacher"))
            {
                pr = Library.PersonRole.Teacher;
            }
            else
            {
                pr = Library.PersonRole.Student;
            }
            Library.OperationStatus os = Database.CourseDBAdapter.getInstance().addPersonToCourse(selectedAddToCoursePerson, id, pr);
            if (os.sucess)
            {
                Library.Utils.sucessFields(selectedAddToCoursePerson.personName + " adicionado(a) com sucesso.", "Operação bem sucedida");
                refreshCoursesList();
            }
            else
            {
                Library.Utils.errorFields("Ocorreu um erro a associar a pessoa à disciplina.", "Erro na operação");
            }
        }

        private void label28_Click(object sender, EventArgs e)
        {

        }

        private void addClass_Click(object sender, EventArgs e)
        {
            string val1 = this.horaInicioTB.Text;
            
            TimeSpan horaTs;
            if (!val1.Contains(":") || val1.Count(f => f == ':') > 1 || val1.Length > 5 || !TimeSpan.TryParse(val1, out horaTs))
            {
                Library.Utils.errorFields("Hora de incio inválida", "Erro a inserir aula.");
                return;
            }
            string val2 = this.duracaoTB.Text;
            TimeSpan duracaoTs;
            if (!val2.Contains(":") || val2.Count(f => f == ':') > 1 || val2.Length > 5 || !TimeSpan.TryParse(val2, out duracaoTs))
            {
                Library.Utils.errorFields("Duração inválida", "Erro a inserir aula.");
                return;
            }
            string val3 = this.diaSemanaLP.Text;
            if (string.IsNullOrEmpty(val3)) {
                Library.Utils.errorFields("Insira um dia da semana.","Erro na operação");
                return;
            }
            string val4 = this.observacoesClass.Text;
            Database.@class myClass = new Database.@class();
            myClass.startTime = horaTs;
            myClass.duration = duracaoTs;
            myClass.dayOfWeek = val3;
            myClass.observationsClass = val4;
            Library.OperationStatus os = Database.CourseDBAdapter.getInstance().addClassToCourse(this.course, myClass);
            if (os.sucess)
            {
                Library.Utils.sucessFields("Nova aula inserida com sucesso.", "Inserir aula");
                this.horaInicioTB.ResetText();
                this.duracaoTB.ResetText();
                this.diaSemanaLP.SelectedIndex = -1;
                this.observacoesClass.ResetText();
                refreshClassList();
            }
            else
            {
                Library.Utils.errorFields("A aula não foi inserida. Possível causa: " + os.errorMessage, "Erro a inserir aula");
            }
        }

        private void deleteAula_Click(object sender, EventArgs e)
        {

            Database.@class classToDel = (Database.@class)listaAulas.SelectedItem;
            if (classToDel != null)
            {
                if (MessageBox.Show("Deseja mesmo remover esta aula da disciplina " + classToDel.course.courseName + "?", "Remover pessoa", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    Library.OperationStatus os = Database.CourseDBAdapter.getInstance().removeClassFromCourse(classToDel);
                    if (os.sucess)
                    {
                        Library.Utils.sucessFields("Aula removida com sucesso.", "Remover aula");
                        refreshClassList();
                    }
                    else
                    {
                        Library.Utils.errorFields("A aula não foi removida. Possível causa: " + os.errorMessage, "Erro a remover aula");
                    }
                }
            }
            else {
                Library.Utils.errorFields("Não existem elementos na lista.", "Erro a remover aula");
            }
        }

        private void verHorarioDiscBut_Click(object sender, EventArgs e)
        {   
            List<Library.CalendarioInput> lci = new List<Library.CalendarioInput>();
            Dictionary<String, ICollection<Database.student>> listaDisciplinasPessoas = new Dictionary<string, ICollection<Database.student>>();
            foreach(var item in  (List<Database.@class>)Database.CourseDBAdapter.getInstance().showClasses(course.courseId).res){
                Library.CalendarioInput ci = new Library.CalendarioInput();
                ci.DayOfWeek = item.dayOfWeek;
                ci.Start = item.startTime;
                ci.End = item.startTime + item.duration;
                if (string.IsNullOrEmpty(course.instrument))
                {
                    ci.Nome = Library.CourseType.getValue(course.courseType).ToString() + ":" + course.courseName;
                }
                else
                {
                    ci.Nome = course.instrument + ":" + course.courseName;
                }
                lci.Add(ci);
            }
            if (string.IsNullOrEmpty(course.instrument))
            {


                listaDisciplinasPessoas.Add(Library.CourseType.getValue(course.courseType).ToString() + ":" + course.courseName, course.student);
            }
            else
            {

                listaDisciplinasPessoas.Add(course.instrument + ":" + course.courseName, course.student);
            }
            pcVerCalend pvc = new pcVerCalend("Horário de " + course.ToString(), "Horário de " + course.ToString(), lci);
            pvc.listaStudents = listaDisciplinasPessoas;
            pvc.populateCalend();
            pvc.Show();
        }

        private void closeLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            this.Close();
        }
    }
}

